package service;

import dao.DisciplinaDAO;
import dao.TurmaDAO;
import excecao.DisciplinaPossuiTurmasException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Curso;
import modelo.Disciplina;
import modelo.Turma;
import util.FabricaDeObjetos;
import util.JPAUtil;

/**
 *
 * @author Abraao
 */
public class DisciplinaService {

    private static DisciplinaDAO disciplinaDAO;
    private static TurmaDAO turmaDAO;

    static {
        try {
            disciplinaDAO = (DisciplinaDAO) FabricaDeObjetos.getObjetoUnico(DisciplinaDAO.class);
            turmaDAO = (TurmaDAO) FabricaDeObjetos.getObjetoUnico(TurmaDAO.class);
        } catch (Exception ex) {
            Logger.getLogger(DisciplinaService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Disciplina> getTodos() {
        return disciplinaDAO.getAll();
    }

    public Disciplina getPorId(Long id) {
        return disciplinaDAO.getPorId(id);
    }

    public List<Disciplina> getPorNome(String nome) {
        return disciplinaDAO.getPorNome(nome);
    }

    public void inserir(Disciplina disciplina) {
        JPAUtil.beginTransaction();
        disciplinaDAO.persist(disciplina);
        JPAUtil.commitTransaction();
    }

    public void remover(Disciplina disciplina) throws DisciplinaPossuiTurmasException {
        JPAUtil.beginTransaction();
        
        Disciplina disciplina1 = disciplinaDAO.getPorId(disciplina.getId());
        List<Turma> turmas = turmaDAO.getPorDisciplina(disciplina1);
        
        if (turmas != null && !turmas.isEmpty()) {
            throw new DisciplinaPossuiTurmasException("A disciplina possui turmas associadas!");
        }
        disciplinaDAO.remove(disciplina1);
        
        JPAUtil.commitTransaction();
    }

    public void alterar(Disciplina disciplinaMod) throws DisciplinaPossuiTurmasException {
        JPAUtil.beginTransaction();
        List<Turma> turmas = turmaDAO.getPorDisciplina(disciplinaMod);
        
        if (turmas != null && !turmas.isEmpty()) {
            throw new DisciplinaPossuiTurmasException("A disciplina possui alunos cadastrados!");
        }
        disciplinaDAO.merge(disciplinaMod);

        JPAUtil.commitTransaction();
    }

    public Disciplina getPorIdComTurmas(Long id) {
        return disciplinaDAO.getPorIdComTurmas(id);
    }

    public List<Disciplina> getDisponiveisPorCurso(Curso cursoCorrente) {
        return disciplinaDAO.getDisponiveisPorCurso(cursoCorrente);
    }
    
    public List<Disciplina> getListaCompletaOrdenadaPorNome() {
        return disciplinaDAO.getListaCompletaOrdenadaPorNome();
    }
}
